package com.zh.umldemo.test05Proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author zh
 * @date 2025/9/8 11:31
 * @description:CGLIB代理工厂
 */
public class CGLIBProxyFactory implements MethodInterceptor {
    //真实对象、目标对象
    private Object target;
    //带参构造注入真实对象
    public CGLIBProxyFactory(Object target) {
        this.target = target;
    }

    /**
     * 1.调用 Enhancer类的 setSuperclass()方法，设置 真实对象 为 代理对象 父类
     * 2.调用 Enhancer类的 create()方法，生成代理对象
     * **/
    //获取代理对象方法
    public Object getProxyObject(){
        //定义Enhancer
        Enhancer enhancer = new Enhancer();
        //注入真实对象
        enhancer.setSuperclass(target.getClass());
        //设置回调函数
        enhancer.setCallback(this);
        //生成代理对象
        Object proxyObject = enhancer.create();
        return proxyObject;
    }

    //重写拦截器，调用真实对象方法，实现功能增强
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("代理方法执行！");
        //调用目标对象方法
        Object obj = method.invoke(target, objects);
        return obj;
    }
}
